<?php

namespace Inscripcion\Controller\Service;

use Inscripcion\Controller\Service\GenericService;
use Inscripcion\Model\Entity\Inscripciones;
use Zend\Db\Adapter\Adapter;
use Componentes\Controller\VariablesGlobales;
use Componentes\Controller\UtilsArrayController;
use Inscripcion\Model\Dao\InscripcionesDAO;
use Componentes\Controller\Mensajes;
use Maestros\Controller\Service\AlumnoService;
use Transaccion\Controller\Service\DatosAcademicosService;
use Transaccion\Controller\Service\EspecialidadService;
use DateTime;
use DateTimeZone;
use Zend\Http\PhpEnvironment\Request;
use Transaccion\Controller\Service\OrganizacionSeccionService;
use Transaccion\Controller\Service\SemestreService;
use Inscripcion\Controller\Service\PensumCursarService;
use Maestros\Controller\Service\LapsoAcademicoService;

class InscripcionesService extends GenericService {

    private $dbAdapter;
    private static $inscripcionesService;

    private function __construct(Adapter $dbAdapter) {
        $this->dbAdapter = $dbAdapter;
    }

    public static function getInstance($adapter) {
        if (self::$inscripcionesService == null) {
            self::$inscripcionesService = new InscripcionesService($adapter);
        }
        return self::$inscripcionesService;
    }

    public function inscribir($cedula, $idOrganizacionSeccion, $lapso, $idControlInscripcion) {
        $servicioOrganizacionSeccion = OrganizacionSeccionService::getInstance($this->dbAdapter);
        $servicioSemestre = SemestreService::getInstance($this->dbAdapter);
        $servicioPensumCursar = PensumCursarService::getInstance($this->dbAdapter);
        $servicioDatosAcademicos = DatosAcademicosService::getInstance($this->dbAdapter);
        $servicioLapsoAcademico = LapsoAcademicoService::getInstance($this->dbAdapter);
        $data = $servicioOrganizacionSeccion->obtenerCuposSeccionSegunOrganizacionSeccionId($idOrganizacionSeccion);
        $cantidad = $data['data'][0][0]['capacidad'];
        $cantidadInscritos = $data['data'][0][0]['cantidadInscritos'];
        $cantidadDisponible = $cantidad - $cantidadInscritos;
        //Validar si aun hay cupo aun en esa seccion
        if ($cantidadDisponible > 0) {
            //Se le resta un cupo para asegurar que otra persona no lo quite en el mismo momento
            $servicioOrganizacionSeccion->actualizarCuposSeccionSegunOrganizacionId($idOrganizacionSeccion, 1);
            //Se valida si existen choques con las demas inscritas
            $arrayChoque = $servicioPensumCursar->getValidarChoques($cedula, $lapso, $idOrganizacionSeccion);
            $choque = $arrayChoque['success'];
            if ($choque == true) {
                $servicioOrganizacionSeccion->actualizarCuposSeccionSegunOrganizacionId($idOrganizacionSeccion, 2);
                $mensaje = $arrayChoque['mensaje'];
                $success = false;
            } else {
                $mensaje = $arrayChoque['mensaje'];
                $success = true;
                $data = $servicioOrganizacionSeccion->obtenerCuposSeccionSegunOrganizacionSeccionId($idOrganizacionSeccion);
                $cantidad = $data['data'][0][0]['capacidad'];
                $cantidadInscritos = $data['data'][0][0]['cantidadInscritos'];
                $cantidadDisponible = $cantidad - $cantidadInscritos;
                $arrayDatosAcademicos = $servicioDatosAcademicos->getUltimoDatosAcademicosSegunCedula($cedula);
                $idLapso = $arrayDatosAcademicos['data']['_lapso'];
                $idDatosAcademicos = $arrayDatosAcademicos['data']['id'];
                $ArrayLapsoAcademico = $servicioLapsoAcademico->getRegistro($idLapso);
                $lapsoAcademico = $ArrayLapsoAcademico['data'][0]['_lapso'];
                if ($lapso == $lapsoAcademico) {
                    $idDatosAcademicos = $arrayDatosAcademicos['data']['id'];
                } else {
                    $idIngresoMalla = $arrayDatosAcademicos['data']['_ingresoMalla'];
                    $idCondicionMatricular = $arrayDatosAcademicos['data']['_condicionMatricular'];
                    $idTrayectoSemestre = $arrayDatosAcademicos['data']['_trayectoSemestre'];
                    $idTurno = $arrayDatosAcademicos['data']['_turno'];
                    $idSeccion = $arrayDatosAcademicos['data']['_seccion'];
                    $servicioDatosAcademicos->createRegistro($idIngresoMalla, $lapso, $idCondicionMatricular, $idTrayectoSemestre, $idTurno, $idSeccion, $idControlInscripcion);
                }
                if ($cantidadDisponible >= 0) {
                    $success = true;
                } else {
                    $success = false;
                    $servicioOrganizacionSeccion->actualizarCuposSeccionSegunOrganizacionId($idOrganizacionSeccion, 2);
                }
            }
        }
        if ($success == true) {
            $arrayDatosAcademicos = $servicioDatosAcademicos->getUltimoDatosAcademicosSegunCedula($cedula);
            $idDatosAcademicos = $arrayDatosAcademicos['data']['id'];
            $servicioSemestre->createRegistro($idOrganizacionSeccion, 1, $idDatosAcademicos);
        }
        return UtilsArrayController::organizarOutput($success, $arrayDatosAcademicos['data'], $mensaje);
    }

    public function eliminarInscripcion($idSemestre) {
        $mensaje = 'null';
        $servicioSemestre = SemestreService::getInstance($this->dbAdapter);
        $servicioOrganizacionSeccion = OrganizacionSeccionService::getInstance($this->dbAdapter);
        $semestre = $servicioSemestre->obtenerSemestreSegunId($idSemestre);
        $data = $servicioOrganizacionSeccion->obtenerCuposSeccionSegunOrganizacionSeccionId($semestre->getOrganizacionSeccion());
        $cantidad = $data['data'][0][0]['cantidadInscritos'];
        if ($semestre->getId() != null) {
            $a = $servicioSemestre->deleteSemestreSegunId($idSemestre);
            $idOrganizacionSeccion = $semestre->getOrganizacionSeccion();
            $servicioOrganizacionSeccion->actualizarCuposSeccionSegunOrganizacionId($idOrganizacionSeccion, 2);
            $success = 1;
            $mensaje = 'Eliminado';
        } else {
            $success = 0;
            $mensaje = 'NO existe el registro';
        }
        return $success;
    }

}
